import 'package:flutter/material.dart';
import '../alert/loading.dart';

// Future 监听器,用于监听 Future 的状态变化，并根据状态显示不同的 UI
class FutureWrapper<T> extends StatelessWidget {
  final Future<T> future; // 要监听的 Future
  final Widget Function(BuildContext context, T data) builder; // 数据加载成功的 UI
  final Widget? loadingWidget; // 自定义加载中 UI（可选）
  final Widget? errorWidget; // 自定义错误 UI（可选）
  final bool showLoading; // 是否显示默认加载动画
  final bool showErrorToast; // 是否显示错误 Toast
  final String? loadingText; // 加载中文字提示
  final String? errorToastText; // 错误 Toast 文字（默认用错误信息）

  const FutureWrapper({
    Key? key,
    required this.future,
    required this.builder,
    this.loadingWidget,
    this.errorWidget,
    this.showLoading = true,
    this.showErrorToast = true,
    this.loadingText,
    this.errorToastText,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<T>(
      future: future,
      builder: (context, snapshot) {
        // 加载中状态
        if (snapshot.connectionState == ConnectionState.waiting) {
          if (showLoading) {
            // 显示默认加载动画
            return Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  const CircularProgressIndicator(),
                  if (loadingText != null) ...[
                    const SizedBox(height: 8),
                    Text(loadingText!),
                  ],
                ],
              ),
            );
          } else {
            // 返回自定义加载 UI
            return loadingWidget ?? const SizedBox();
          }
        }

        // 错误状态
        if (snapshot.hasError) {
          if (showErrorToast) {
            // 显示错误 Toast
            Loading.showError(errorToastText ?? snapshot.error.toString());
          }
          // 返回自定义错误 UI 或默认错误提示
          return errorWidget ??
              Center(
                child: Text(
                  '加载失败: ${snapshot.error}',
                  style: const TextStyle(color: Colors.red),
                ),
              );
        }

        // 数据加载成功
        return builder(context, snapshot.data as T);
      },
    );
  }
}
